﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace iNet.IO
{
	/// <summary>
	/// 暫存檔案資料流，暫存檔將於資料流關閉後自動刪除。
	/// </summary>
	public class TempFileStream : FileStream
	{
		#region 建構子
		/// <summary>
		/// 初始化新的 TempFileStream 執行個體。
		/// </summary>
		/// <exception cref="IOException">建立暫存檔時發生錯誤。</exception>
		public TempFileStream()
			: base(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None)
		{ }
		/// <summary>
		/// 初始化新的 TempFileStream 執行個體。
		/// </summary>
		/// <param name="share">暫存檔案共用權限。</param>
		/// <exception cref="IOException">建立暫存檔時發生錯誤。</exception>
		public TempFileStream(FileShare share)
			: base(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, share)
		{ }
		/// <summary>
		/// 初始化新的 TempFileStream 執行個體。
		/// </summary>
		/// <param name="srcStream">來源資料流，其中的資料將被複製至暫存檔中。</param>
		/// <exception cref="IOException">建立暫存檔 或 複製資料時發生錯誤。</exception>
		/// <exception cref="ArgumentNullException">srcStream 為 Null (Visual Basic 為 Nothing)。</exception>
		public TempFileStream(Stream srcStream)
			: this()
		{
			try
			{
				//確認
				if (srcStream == null)
					throw new ArgumentNullException();

				//複製資料
				srcStream.CopyTo(this);
				this.Position = 0;
			}
			catch
			{
				//刪除檔案
				this.Close();

				//擲出例外
				throw;
			}
		}
		/// <summary>
		/// 初始化新的 TempFileStream 執行個體。
		/// </summary>
		/// <param name="srcFileName">來源檔案路徑，其中的資料將被複製至暫存檔中。</param>
		/// <exception cref="IOException">建立暫存檔 或 複製資料時發生錯誤。</exception>
		/// <exception cref="ArgumentNullException">srcFileName 為 Null (Visual Basic 為 Nothing)。</exception>
		public TempFileStream(string srcFileName)
			: this()
		{
			try
			{
				//確認
				if (srcFileName == null)
					throw new ArgumentNullException();

				//複製資料
				using (FileStream srcStream = new FileStream(srcFileName, FileMode.Open, FileAccess.Read))
					srcStream.CopyTo(this);
				this.Position = 0;
			}
			catch
			{
				//刪除檔案
				this.Close();

				//擲出例外
				throw;
			}
		}
		#endregion
		#region Close
		/// <summary>
		/// 關閉資料流，並將暫存檔刪除。
		/// </summary>
		public override void Close()
		{
			//取得檔案名稱
			string tempFileName = this.Name;

			//呼叫基底
			base.Close();

			//刪除暫存檔
			try
			{
				File.Delete(tempFileName);
			}
			catch
			{ }
		}
		#endregion
	}
}
